let Tokeniser;
(function() {
	/*
	1.或正则式 先后顺序区别很大
	2.关键词是变量的子集
	3. -5 这种可以解析为<-5> 或 <-><5> 具有二义性 但是 >=具有二义性却不受影响
	
	*/
	function _isKeyword(text) {
		let set = new Set(['if', 'elseif','else', , 'while', 'print', 'return','fun','dim','or','and']); 
		return set.has(text)
	}
	function _getOperator(text) {
		let reg = /^(\(|\)|\{|\}|\+|\-|\*|\/|&&|\|\||=|:=|!=|>=|>|<=|<|,|;)/
		return text.match(reg)
	}
	function _getNumber(text){
		let reg = /^((([1-9][0-9]+)|[0-9])(\.[0-9]*[1-9])?)/
		return text.match(reg)
	}
	function _getVariable (text){
		let reg = /^[a-zA-Z_][0-9a-zA-Z_]*/
		return text.match(reg)
	}

	function _getToken(text) {
		let token;
		token = _getOperator(text)
		if(token) {
			return {
				type:'operator',
				value:token
			}
		}
		token = _getNumber(text)
		if(token) {
			return {
				type:'number',
				value:token
			}
		}
		token = _getVariable(text)
		if(token) {
			return {
				type:'variable',
				value:token
			}
		}
		return false
	}

	let tokeniser = function(code) {
		code = code.replace(/\t/g, ' ').replace(/\n/, ' ').replace(/	/, ' ')
		code = code.trim()
		let tokens = []
		while(code!==''){
			let token = _getToken(code)
			if(token){
				let value = token.value[0]
				tokens.push({
					type:token.type,
					value:value
				})
				code =code.substr(value.length)
			}else {
				throw Error(code[0]+'附近词法分析错误')
			}
			code = code.trim()
		}
		for(let i =0;i<tokens.length;i++){
			let token = tokens[i]
			if(_isKeyword(token.value)) {
				token.type = 'keyword'
			}
		}
		return tokens
	}
	Tokeniser = tokeniser
})()
